package com.cx330;

public class Example92 {
    public static void main(String[] args) {
        Game basketBallGame = new BasketBallGame();
        basketBallGame.play(); // 调用模板方法
        Game footBallGame = new FootBallGame();
        footBallGame.play(); // 调用模板方法
    }
}

abstract class Game { // 模板类
    // 模板方法，定义了游戏的基本流程
    public final void play() {
        System.out.println("模板方法start");
        initialize();
        startPlay();
        endPlay();
        System.out.println("模板方法end");
    }

    // 抽象方法，由子类实现
    protected abstract void initialize();

    protected abstract void startPlay();

    protected abstract void endPlay();
}

class BasketBallGame extends Game { // 具体子类

    @Override
    protected void initialize() {
        System.out.println("篮球游戏初始化");
    }

    @Override
    protected void startPlay() {
        System.out.println("篮球游戏开始");
    }

    @Override
    protected void endPlay() {
        System.out.println("篮球游戏结束存盘");
    }
}

class FootBallGame extends Game {

    @Override
    protected void initialize() {
        System.out.println("足球游戏初始化");
    }

    @Override
    protected void startPlay() {
        System.out.println("足球游戏开始");
    }

    @Override
    protected void endPlay() {
        System.out.println("足球游戏结束存盘");
    }
}